// 深复制对象，并返回新对象。可复制方法
const deepClone = (obj) => {
	if (typeof obj !== 'object' || obj === null || !obj) {
		return obj
	}
	var result
	if (obj instanceof Array) {
		result = []
		for (let item of obj) {
			result.push(deepClone(item))
		}
	} else {
		result = {}
		for (let key in obj) {
			if (obj.hasOwnProperty(key)) {
				if (typeof obj[key] === 'function') {
				    result[key] = obj[key]
				} else {
				    result[key] = deepClone(obj[key])
				}
			}
		}
	}
	return result
}

/**
 * 延迟执行
 */
const delayAction = (action, delay = 1000) => {
	const timer = setTimeout(() => {
		action && action()
		clearTimeout(timer)
	}, delay)
}

/**
 * toaast显示
 * title：显示内容
 * action：显示后执行的动作
 */
const showToast = (title, action, icon = 'none', duration) => {
	if (!duration) {
		if (title.length > 50) {
			duration = 5000
		} else if (title.length > 10) {
			duration = 3000
		} else if (title.length > 5) {
			duration = 2000
		} else {
			duration = 1500
		}
	}
	uni.showToast({
		title,
		icon,
		duration,
	})
	if (action) {
		delayAction(action, duration)
	}
}
/**
 * 主动隐藏toast
 */
const hideToast = () => {
	uni.hideToast()
}

/**
 * 显示loading
 */
const showLoading = (title = '加载中...') => {
	uni.showLoading({
		title
	})
}
/**
 * 隐藏loading
 */
const hideLoading = () => {
	uni.hideLoading()
}

/**
 * 粘贴 - 获取剪切板内容
 */
const getClipboardData = (hideToast = true) => {
	return new Promise((resolve, reject) => {
		// #ifndef H5
		uni.getClipboardData({
			success: (res) => {
				resolve(res.data)
			},
			fail: (err) => {
				reject('获取剪切板错误')
				if (!hideToast) {
					showToast('获取剪切板错误')
				}
			}
		})
		// #endif
		// #ifdef H5
		navigator.clipboard.readText().then(res => {
			resolve(res)
		}).catch(err => {
			reject('获取剪切板错误')
			if (!hideToast) {
				showToast('获取剪切板错误')
			}
		})
		// #endif
	})
}
/**
 * 复制 - 设置剪切板内容
 * data需要复制的内容
 * success：复制成功的处理。不再使用默认的Toast
 * fail：复制失败的处理。不再使用默认的Toast
 */
const setClipboardData = (data, {success, fail, hideToast = false} = {}) => {
	return new Promise((resolve, reject) => {
		if (data) {
			uni.setClipboardData({
				data: String(data),
				showToast: false,
				success: (res) => {
					if (success) {
						success(res)
					} else {
						if (hideToast) {
							resolve()
						} else {
							showToast('复制成功')
						}
					}
				},
				fail: (err) => {
					if (fail) {
						fail(err)
					} else {
						if (hideToast) {
							reject()
						} else {
							showToast('复制失败')
						}
					}
				}
			})
		} else {
			reject()
			if (!hideToast) {
				showToast('复制内容不能为空')
			}
		}
	})
}

module.exports = {
	deepClone, // 深复制对象，并返回新对象
	delayAction, // 延迟执行
	showToast, // toast显示
	hideToast, // 主动隐藏toast
	showLoading, // 显示loading
	hideLoading, // 隐藏loading
	getClipboardData, // 粘贴 - 获取剪切板内容
	setClipboardData // 复制 - 设置剪切板内容
}